home *** CD-ROM | disk | FTP | other *** search
/ MacHack 1997 / MacHack 1997.toast / Hacks / Hacks ’96 / VideoFolder 1.0a / Source / SequenceGrabberPane.cp < prev    next >
Text File  |  1996-06-21  |  5KB  |  233 lines

  1. #include <Errors.h>
  2. #include "MoreFilesExtras.h"
  3. #include "SequenceGrabberPane.h"
  4.  
  5.  
  6. SequenceGrabberPane* SequenceGrabberPane::CreateSequenceGrabberPaneStream(LStream *inStream)
  7. {
  8.     return new SequenceGrabberPane ( inStream );
  9. }
  10.     
  11. SequenceGrabberPane::SequenceGrabberPane()
  12. {
  13. }
  14.  
  15. SequenceGrabberPane::SequenceGrabberPane(const SequenceGrabberPane &inOriginal)
  16. {
  17. }
  18.                     
  19. // SequenceGrabberPane::SequenceGrabberPane(const SSequenceGrabberPaneInfo &inSequenceGrabberPaneInfo);
  20.  
  21. SequenceGrabberPane::SequenceGrabberPane(LStream *inStream) :
  22.     LView  ( inStream )
  23. {
  24. }
  25.     
  26. SequenceGrabberPane::~SequenceGrabberPane()
  27. {
  28.     StopIdling();
  29.     
  30.     if (fSequenceGrabberComponent)
  31.     {
  32.         SGStop (fSequenceGrabberComponent);
  33.         CloseComponent (fSequenceGrabberComponent);
  34.     }
  35.     
  36.     if ( mGWorld )
  37.         delete mGWorld;
  38.         
  39.     if (fQuickTime)
  40.         ExitMovies ();
  41. }
  42.  
  43. void SequenceGrabberPane::SetUpdateDirectToScreen ( )
  44. {
  45.     #if 0
  46.     if ( GetMacPort() )
  47.     {
  48.         ThrowIfOSErr_( ::SGSetUseScreenBuffer ( fVideoChannel, true ) );
  49.  
  50.         ThrowIfOSErr_( ::SGSetGWorld ( fVideoChannel, (GWorldPtr) GetMacPort(), nil ) );
  51.         
  52.         Rect frameRect;
  53.         if ( CalcPortFrameRect ( frameRect ) )
  54.             ThrowIfOSErr_( ::SGSetChannelBounds ( fVideoChannel, & frameRect ) );
  55.     }
  56.     #endif
  57. }
  58.  
  59. void SequenceGrabberPane::DoSetupDialog ( )
  60. {
  61.     OSErr err = SGSettingsDialog ( fSequenceGrabberComponent, fVideoChannel, 0, nil, 0, nil, 0 );
  62.     if ( err == userCanceledErr )
  63.         err = noErr;
  64.         
  65.     ThrowIfOSErr_( err );
  66. }
  67.  
  68. void SequenceGrabberPane::DrawSelf ( )
  69. {    
  70.     Rect frameRect;
  71.     if (fSequenceGrabber && CalcPortFrameRect ( frameRect ) )
  72.     {    GrafPtr currentPort;
  73.         GetPort ( & currentPort );
  74.         
  75.         // Rect gWorldRect = mGWorld->GetMacGWorld()->portRect;
  76.                 
  77.         mGWorld->CopyImage ( currentPort, frameRect );        
  78.         
  79.         // SGUpdate ( fSequenceGrabberComponent, GetMacPort()->visRgn );
  80.     }
  81. }
  82.  
  83. void SequenceGrabberPane::FinishCreate()
  84. {
  85.     fSequenceGrabber = false;
  86.     fSequenceGrabberComponent = nil;
  87.     mGWorld = nil;
  88.  
  89.     //    Initialize QuickTime.
  90.     long gestaltResponse;
  91.     if (Gestalt (gestaltQuickTime, &gestaltResponse) == noErr && EnterMovies () == noErr)
  92.         fQuickTime = true;
  93.     else
  94.         fQuickTime = false;
  95.  
  96.     InitializeSequenceGrabber ();
  97.     
  98.     StartIdling();
  99.     
  100.     // SetUpdateDirectToScreen();
  101. }
  102.  
  103. void SequenceGrabberPane::Grab ( )
  104. {    Byte wasPaused = seqGrabPause;
  105.  
  106.     ThrowIfOSErr_( SGGetPause ( fSequenceGrabberComponent, & wasPaused ) );
  107.     if ( seqGrabPause != seqGrabUnpause )
  108.     {
  109.         SGPause ( fSequenceGrabberComponent, seqGrabUnpause );
  110.         Refresh();
  111.     }
  112.  
  113.     SGIdle ( fSequenceGrabberComponent );
  114.  
  115.     ThrowIfOSErr_( SGPause ( fSequenceGrabberComponent, wasPaused ) );
  116. }
  117.  
  118.  
  119. void SequenceGrabberPane::InitializeSequenceGrabber ( )
  120. {    OSErr error = noErr;
  121.     const unsigned kPixelDepth = 0;    
  122.     
  123.     Try_ {        
  124.         ThrowIfNot_( fQuickTime );    
  125.         
  126.         //    Initialize the sequence grabber component.
  127.         
  128.         fSequenceGrabberComponent = ::OpenDefaultComponent (SeqGrabComponentType, 0);    
  129.         ThrowIfNil_( fSequenceGrabberComponent );
  130.  
  131.         ThrowIfOSErr_ ( ::SGInitialize (fSequenceGrabberComponent) );
  132.             
  133.         //    Initialize a video channel.
  134.         
  135.         ThrowIfOSErr_( ::SGNewChannel (fSequenceGrabberComponent, VideoMediaType, &fVideoChannel) );
  136.         
  137.         Rect frameRect = { 0, 0, 240, 320 };
  138.         CalcPortFrameRect ( frameRect );
  139.  
  140.         mGWorld = new LGWorld ( frameRect, 0, useTempMem ); 
  141.         ThrowIfOSErr_( ::SGSetGWorld (fSequenceGrabberComponent, mGWorld->GetMacGWorld(), nil) );
  142.  
  143.         // ThrowIfOSErr_( ::SGGetSrcVideoBounds (fVideoChannel, & mSourceVideoBounds) );
  144.         ThrowIfOSErr_( ::SGSetChannelBounds ( fVideoChannel, & frameRect ) );
  145.                 
  146.         ThrowIfOSErr_( ::SGSetChannelUsage (fVideoChannel, seqGrabPreview | seqGrabPlayDuringRecord) );
  147.  
  148.         SGSetUseScreenBuffer ( fVideoChannel, false );
  149.         // SetUpdateDirectToScreen();
  150.  
  151.         //    Start video capture.
  152.  
  153.         ThrowIfOSErr_( ::SGStartPreview (fSequenceGrabberComponent) );
  154.             
  155.         fSequenceGrabber = true;
  156.     }
  157.     
  158.     Catch_ ( inErr )
  159.     {
  160.         if (fSequenceGrabberComponent) {
  161.             CloseComponent (fSequenceGrabberComponent);
  162.             fSequenceGrabberComponent = nil;
  163.         }
  164.         if ( mGWorld ) {
  165.             delete mGWorld;
  166.             mGWorld = nil;
  167.         }
  168.         fSequenceGrabber = false;
  169.         
  170.         Throw_( inErr );
  171.     }
  172. }
  173.  
  174. void SequenceGrabberPane::ResizeFrameBy(Int16 inWidthDelta, Int16 inHeightDelta, Boolean inRefresh)
  175. {
  176.     LPane::ResizeFrameBy ( inWidthDelta, inHeightDelta, false );
  177.     
  178.     Rect frameRect;
  179.     if ( CalcPortFrameRect ( frameRect ) )
  180.     {
  181.         ThrowIfOSErr_( ::SGStop (fSequenceGrabberComponent) );
  182.  
  183.         delete mGWorld;
  184.         mGWorld = new LGWorld ( frameRect, 0, useTempMem );
  185.         ThrowIfOSErr_( ::SGSetGWorld (fSequenceGrabberComponent, mGWorld->GetMacGWorld(), nil) );
  186.         ThrowIfOSErr_( ::SGSetChannelBounds ( fVideoChannel, & frameRect ) );
  187.  
  188.         ThrowIfOSErr_( ::SGStartPreview (fSequenceGrabberComponent) );
  189.         
  190.         Grab();
  191.     }
  192.     
  193.     if ( inRefresh )
  194.         Refresh();
  195. }
  196.  
  197. void SequenceGrabberPane::SetLiveUpdate ( Boolean newValue )
  198. {
  199.     if ( newValue )
  200.     {
  201.         SGPause ( fSequenceGrabberComponent, seqGrabUnpause );
  202.         StartIdling ();
  203.     }
  204.     else
  205.     {
  206.         SGPause ( fSequenceGrabberComponent, seqGrabPause );
  207.         StopIdling();
  208.     }
  209.     
  210.     mLiveUpdate = newValue;
  211. }
  212.  
  213. void SequenceGrabberPane::SpendTime( const EventRecord &inMacEvent)
  214. {
  215.     if ( fSequenceGrabberComponent )
  216.         SGIdle ( fSequenceGrabberComponent );
  217.  
  218.     Boolean drawingOnscreen;
  219.     ThrowIfOSErr_( ::SGGetUseScreenBuffer ( fVideoChannel, & drawingOnscreen ) );
  220.     if ( mLiveUpdate && ! drawingOnscreen && FocusDraw() )
  221.         DrawSelf ();
  222. }
  223.  
  224. Handle SequenceGrabberPane::GetConfiguration () const
  225. {
  226.     return NewHandle ( 0 );
  227. }
  228.  
  229. void SequenceGrabberPane::SetConfiguration ( Handle h )
  230. {
  231.  
  232. }
  233.